#include <linux/kernel.h>
#include <linux/module.h> /* kernel module*/
#include <linux/kprobes.h> /* kprobe */
#include <linux/kthread.h> /* kernel thread */
#include <linux/delay.h>
#include <linux/kallsyms.h>
#include <asm/syscall.h> /* NR_syscalls */
#include <linux/spinlock.h> /* spin_lock */
#include <asm/insn.h> /* 指令 */

static struct kprobe kp; // 声明一个kprobe 结构体


/* -------------------- 一些宏定义  START -------------------- */
#define MAX_SYMBOL_LEN	64 // 内核符号名的最大长度
#define MAX_HIDE_MODULE 64 // 隐藏模块的最大数量
#define MAX_KERNEL_FUNC 64 // 需要检查的内核函数最大数量
#define MAX_INSN_NUM 10 // 需要检查的跳转指令最大数量
#define MAX_SEERCH_DEPTH 64 // 往下查找的最大深度


#define BETWEEN(x, y, z) ( \
    ((unsigned long)x >= (unsigned long)y) && \
    ((unsigned long)x < ((unsigned long)y+(unsigned long)z)) \
) // 定义x在y和z之间的宏

// 调试用 START
#define ENTER() printk(KERN_DEBUG "%s() Enter", __func__) // 打印进入信息
#define EXIT() printk(KERN_DEBUG "%s() Exit", __func__) // 打印退出信息
#define ERR(fmt, args...) printk(KERN_ERR "%s()-%d: " fmt "\n", __func__, __LINE__, ##args)
#define DBG(fmt, args...) printk(KERN_DEBUG "%s()-%d: " fmt "\n", __func__, __LINE__, ##args)
#define DBG_NUM(name, num) printk(KERN_DEBUG "%s() Debug %s: %lx\n", __func__, name, num)
#define DBG_STR(name, str) printk(KERN_DEBUG "%s() Debug %s: %s\n", __func__, name, str)
#define DBG_CHR(name, chr) printk(KERN_DEBUG "%s() Debug %s: %c\n", __func__, name, chr)
#define DBG_INSN(addr, length, prefixes, rex_prefix, vex_prefix, opcode, modrm, sib, displacement, immediate1, immediate2) printk(KERN_DEBUG "addr:%lx, length:%d\n prefixes:%lx, rex_prefix:%lx, vex_prefix:%lx, opcode=%lx, modrm=%lx, sib=%lx, disp=%lx, imm1=%lx, imm2=%lx", addr, length, prefixes, rex_prefix, vex_prefix, opcode, modrm, sib, displacement, immediate1, immediate2)
        // DBG_INSN(insn_check_addr, cur_insn.length, 
        // cur_insn.prefixes.value, cur_insn.rex_prefix.value, cur_insn.vex_prefix.value, 
        // cur_insn.opcode.value, cur_insn.modrm.value, cur_insn.sib.value, 
        // cur_insn.displacement.value, cur_insn.immediate1.value, cur_insn.immediate2.value);
#define INFO(str) pr_info("%s\n", str)
// 调试用 END

/* -------------------- 一些宏定义  END -------------------- */



/* -------------------- 函数指针声明  START -------------------- */
// 系统调用类型的函数指针 t_syscall
typedef asmlinkage long (*t_syscall)(const struct pt_regs *);
// kallsyms_lookup_name类型的函数指针 kallsyms_lookup_name_t
typedef unsigned long (*kallsyms_lookup_name_t)(const char *name);
// core_kernel_text类型的函数指针 core_kernel_text_t
typedef int (*core_kernel_text_t)(unsigned long addr);
// find_module类型的函数指针 find_module_t
typedef struct module *(*find_module_t)(const char *name);
// __module_address类型的函数指针 __module_address_t
typedef struct module *(*__module_address_t)(unsigned long addr);
// __module_address类型的函数指针 __module_address_t
typedef typeof(insn_init) * insn_init_t;
typedef typeof(insn_get_length) * insn_get_length_t;
typedef typeof(insn_get_opcode) * insn_get_opcode_t;
typedef typeof(insn_get_immediate) * insn_get_immediate_t;
typedef typeof(insn_get_modrm) * insn_get_modrm_t;
typedef typeof(insn_get_sib) * insn_get_sib_t;
typedef typeof(insn_get_displacement) * insn_get_displacement_t;
typedef typeof(insn_get_prefixes) * insn_get_prefixes_t;
/* -------------------- 函数指针声明 END -------------------- */


